package 注解.应用场景;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {
    //    public static void main(String[] args) {
//        // 模拟Junit框架
//
//        // 需求:
//        // 定义若干个方法, 只要加了MyTest注解, 就会触发该方法执行
//
//        // 分析:
//        // 1. 定义一个自定义注解MyTest, 只能注解方法, 存活范围是一直都在.
//        // 2. 定义若干个方法, 部分方法加上@MyTest注解修饰, 部分方法不加.
//        // 3. 模拟Junit程序, 可以触发加了@MyTest注解的方法执行.
//
//    }
//    @MyTest
    public void test1() {
        System.out.println("===test1===");
    }

    @MyTest
    public void test2() {
        System.out.println("===test2===");
    }

    //    @MyTest
    public void test3() {
        System.out.println("===test3===");
    }

    @MyTest
    public void test4() {
        System.out.println("===test4===");
    }

    public static void main(String[] args) throws Exception {
        // 启动程序!
        // 1. 得到Class对象
        Class c = Test.class;
        // 2. 提取这个类中的全部成员方法
        Method[] methods = c.getDeclaredMethods();
        // 3. 遍历这个数组的每个方法, 看方法上是否存在@MyTest注解, 存在则除法该方法执行.
        for (Method method : methods) {
            if (method.isAnnotationPresent(MyTest.class)) {
                // 说明当前方法上是存在@MyTest, 触发当前方法执行.
                method.invoke(new Test());
            }
        }
    }
}
